#include "mystdio.h" // 包含我们自定义的库头文件
#include <stdio.h>   // 用于标准的 printf
#include<string.h>
int main() {
    // 1. 测试文件打开 (写模式)
    // 尝试打开一个名为 "output.txt" 的文件，模式为 "w" (只写，如果存在则清空，不存在则创建)
    myFILE *fp_write = my_fopen("output.txt", "w");

    // 检查文件是否成功打开
    if (fp_write == NULL) {
        perror("Failed to open output.txt for writing"); // 打开失败，打印错误信息
        return 1; // 返回非零表示程序出错
    }

    printf("Successfully opened output.txt for writing.\n");
    DebugPrint(fp_write); // 打印文件流的初始状态 (用于调试)

    // 2. 测试写入数据 (会写入缓冲区)
    const char *data1 = "Hello, ";
    const char *data2 = "world!\n"; // 包含换行符，会触发 LINE_FLUSH
    const char *data3 = "This is a second line.\n";

    // 写入 data1
    printf("Writing '%s' (%zu bytes) to buffer...\n", data1, strlen(data1));
    my_fwrite(fp_write, data1, strlen(data1));
    DebugPrint(fp_write); // 打印写入后的状态

    // 写入 data2 (包含换行符)
    printf("Writing '%s' (%zu bytes) to buffer...\n", data2, strlen(data2));
    my_fwrite(fp_write, data2, strlen(data2)); // 写入换行符会触发刷新
    // 预期：由于是 LINE_FLUSH 模式且写入了 '\n'，这里会自动调用 my_fflush
    // "Hello, world!\n" 应该被写入到 output.txt 文件中
    DebugPrint(fp_write); // 打印刷新后的状态 (pos 应该回到 0)

    // 写入 data3 (包含换行符)
    printf("Writing '%s' (%zu bytes) to buffer...\n", data3, strlen(data3));
    my_fwrite(fp_write, data3, strlen(data3)); // 再次写入换行符，触发刷新
    // 预期："This is a second line.\n" 应该被写入到 output.txt 文件中
    DebugPrint(fp_write); // 打印刷新后的状态

    // 3. 测试写入数据直到缓冲区满 (测试 FULL_FLUSH - 虽然默认是 LINE_FLUSH)
    // 注意：默认模式是 LINE_FLUSH，要测试 FULL_FLUSH 需要在 my_fopen 后修改 flush_mode
    // 或者修改 my_fopen 让它支持设置模式。这里先按默认 LINE_FLUSH 模式来。
    // 如果要测试 FULL_FLUSH，可以写入大量不含换行的数据，直到超过 SIZE
    printf("\nTesting potential FULL_FLUSH (if mode were FULL_FLUSH)...\n");
    char big_data[SIZE + 100]; // 大于缓冲区容量的数据
    memset(big_data, 'A', sizeof(big_data) - 1); // 填充数据，不含换行
    big_data[sizeof(big_data)-1] = '\0';

    // 假设我们将 flush_mode 改为 FULL_FLUSH (实际代码中 my_fopen 硬编码为 LINE_FLUSH)
    // 如果是 FULL_FLUSH 模式，my_fwrite 会尝试写入到缓冲区，满时刷新
    // 如果数据量 > 缓冲区容量 (SIZE)， my_fwrite 会有问题 (我们之前的分析)
    // 这里的测试是为了演示，如果 my_fwrite 是健壮的，会如何工作。
    // 对于我们当前的带溢出风险的代码，写入大于 SIZE 的数据会导致崩溃！
    // **请小心测试这一段，尤其是在没有修复 my_fwrite 缓冲区溢出前！**
    // 以下代码段在未修复 my_fwrite 缓冲区溢出前，可能会导致程序崩溃！
    /*
    printf("Attempting to write data > buffer capacity (DANGEROUS if not fixed!)...\n");
    // 如果修复了溢出，这里的 my_fwrite 应该会分多次写入和刷新
    my_fwrite(fp_write, big_data, sizeof(big_data) - 1);
    DebugPrint(fp_write);
    */
    printf("Skipping dangerous large write test for now.\n");


    // 4. 测试强制刷新
    printf("\nTesting manual flush...\n");
    const char *data4 = "This data should be flushed manually.";
    my_fwrite(fp_write, data4, strlen(data4)); // 写入一些数据到缓冲区
    DebugPrint(fp_write); // 数据在缓冲区中

    my_fflush(fp_write); // 强制刷新缓冲区
    // 预期："This data should be flushed manually." 应该被写入到 output.txt 文件中
    DebugPrint(fp_write); // 打印刷新后的状态 (pos 应该回到 0)

    // 5. 测试文件关闭
    printf("\nClosing file...\n");
    my_fclose(fp_write); // 关闭文件 (会自动先刷新缓冲区，然后关闭文件描述符，释放内存)
    // 预期：如果在关闭前缓冲区还有数据 (除了 data4)，也会被写入 output.txt
    // 例如，如果在 data4 后又写入了数据但没满缓冲区也没换行，它们会在 my_fclose 中被刷新。
    printf("File closed.\n");

    // ----------------------------------------------------------
    // 6. 测试文件打开 (只读模式) - 注意我们的 mysdio 没有实现 fread，所以只能打开和关闭
    /*
    printf("\nTesting file open (read mode)...\n");
    myFILE *fp_read = my_fopen("output.txt", "r");
    if (fp_read == NULL) {
        perror("Failed to open output.txt for reading");
    } else {
        printf("Successfully opened output.txt for reading.\n");
        DebugPrint(fp_read);
        // 在这里应该调用 my_fread() 来读取数据，但它没有实现
        my_fclose(fp_read); // 关闭只读文件
        printf("File closed (read mode).\n");
    }
    */
    printf("\nSkipping read mode test as fread is not implemented.\n");


    // 7. 测试文件打开 (追加模式)
     printf("\nTesting file open (append mode)...\n");
    myFILE *fp_append = my_fopen("output.txt", "a");
    if (fp_append == NULL) {
        perror("Failed to open output.txt for appending");
        return 1;
    }

    printf("Successfully opened output.txt for appending.\n");
    DebugPrint(fp_append);

    const char *data5 = "Appended line 1.\n";
    my_fwrite(fp_append, data5, strlen(data5)); // 写入追加数据
    printf("Writing '%s' (%zu bytes) to buffer...\n", data5, strlen(data5));
    DebugPrint(fp_append);

     my_fflush(fp_append); // 刷新
    DebugPrint(fp_append);

    const char *data6 = "Appended line 2.\n";
    my_fwrite(fp_append, data6, strlen(data6)); // 写入追加数据
     printf("Writing '%s' (%zu bytes) to buffer...\n", data6, strlen(data6));
    DebugPrint(fp_append);

    my_fclose(fp_append); // 关闭追加文件
    printf("File closed (append mode).\n");


    return 0; // 程序正常结束
}
